<!DOCTYPE html>
<html lang="zh-CN">
<head>
	<meta charset="utf-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
	<meta name="viewport" content="width=device-width, initial-scale=1">
	<!-- 上述3个meta标签*必须*放在最前面，任何其他内容都*必须*跟随其后！ -->
	<title>Learning PHP设计模式</title>

	<!-- Bootstrap -->
	<link href="../css/bootstrap.min.css" rel="stylesheet">

	<style>
		article {
			background: -moz-linear-gradient(top, #fb0, #f50);
		}
	</style>
	<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
	<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
	<!--[if lt IE 9]>
	<script src="http://cdn.bootcss.com/html5shiv/3.7.2/html5shiv.min.js"></script>
	<script src="http://cdn.bootcss.com/respond.js/1.4.2/respond.min.js"></script>
	<![endif]-->
</head>
<body>
<article>
	<header><h1>前言</h1></header>
	<p>设计模式（Design Patterns）是指对给定上下文（Context,或译为环境）中某个经常出现的问题得出的一种一般性可重要的解决方案。</p>

	<p>使用OOP编程从观念上要有所转变：并不把编程看作一系列语句，而应当看作是对象之间的一种交互和通信。设计模式的基础就是OOP。</p>
</article>
<section class="part">
	<h1>第一部分 轻松掌握设计模式基础</h1>
	<article>
		<header><h1>第1章 PHP与面向对象编程</h1></header>
		<p>把问题分解为小的子问题，这个过程就是模块化过程，然而，需要方法将子问题组织在一起。</p>
		<p>面向对象编程的首要原则之一：单一职能原因，一个类应当只有一个职责。下面是一个单一职责类的示例：</p>
		<pre>
			class TelAll{
				private $userAgent;
				public function __construce() {
					$this->userAgent = $_SERVER['HTTP_USER_AGENT'];
					return $this->userAgent;
			}
		</pre>
		<p>这个类只做了一件事显示客户端浏览器类型。（不过，这是不是值得？），在类定义后面将类实例化就相当于自启动，除了客户类（Client，这相当于程序入口，可以理解为用于与用户交互的类）之外，不推荐其他类自启动。包含 类的PHP文件也应当由其他模块使用，而不是自启动。本书中经常见到名为Client为的类，它的作用是从构成设计模式的类发出请求。</p>
		<p>在PHP代码的最前面应当有这样两行:</p>
		<pre>
			ini_set('display_errors', '1');
			ERROR_REPORTING(E_ALL);
		</pre>
	</article>
	<article>
		<header><h1>第2章 OOP基本概念</h1></header>
		<p>抽象（abstraction）指示一个对象的基本特征，使它与所有其他对象区分开，从而从查看者的角度提供了清晰定义的概念边界。</p>
		<p>函数名和参数合在一起称为签名（参数的多少不能作为区分函数的依据，PHP不支持函数重载），接口的核心部分，就是由类中定义的所有的函数（类中称其为方法或操作）签名组成的。</p>
		<p>抽象类也可以有具体方法，而且也可以全部是具体方法。继承抽象类的子类必须实现所有抽象方法。</p>
		<p>接口用interface定义，它只能包含函数签名定义（不用abstract声明，但不能有实现）和常量（和类一样用const定义常量），甚至接口中可以只有常量没有方法，但是不能包含变量。接口名前一般加前缀大写I以与类区分。要实现一个接口使用implements语句。</p>
		<p>一个类一但实现了一个接口，就可以说该类匹配接口类型，即一个接口的多个实现都是属同一个接口名（类型），这样的好外是可以绑定多种实现不是一种特定的实现。函数可以接受类变量，也可以接受用接口类型声明的变量。</p>
		<p>封装就是划分一个抽象的诸多元素的过程，这些元素构成该抽象的结构和行为；封装的作用就是将抽象的契约接口与其实现分离。</p>
		<p>不要直接请求完成一个工作所需的信息，而应当让拥有这个信息的对象自己完成工作。</p>
		<p>虽然PHP可以使用多重继承，但是这种方式会影响封装，因为即便对底层的父类做简单修改也可能对子类带来严重的破坏。</p>
		<p>接口，是方法的集合，也就是可以对一个对象执行的操作集合，它让用户知道该如何操作一个类，也可以理解为是类的操作界面。</p>
		<p>PHP中没有函数返回值的声明，因为它是弱类型语言，但是可以通过在函数上方写注释来说明要返回的值，比如：//@return 字符串。不使用return则可以直接写“无返回值”，不需要加@return。</p>
	</article>
	<article>
		<header><h1>第3章 基本设计模式概念</h1></header>
		<p>MVC中的M就是模型，负责对数据的业务上或应用逻辑上的不同调用。V是视图，是用户看到和使用的界面，C控制器则表示模型的具体实现。比如对一个恒温器来说：Model是用来实现指定的温度，View是它的操作界面，即温度调节开关，Control则是用来设定温度值。过程是这样的：用户调节（Control）开关（View）温度值，开关将值发送给主机实现温度调节（Model）。MVC代表一种结构，实现各个部分的松耦合。MVC的关系如下图：</p>
		<img src="images/mvc.jpeg" />
		<p>MVC只是一种实现手段，但它不能用于解决所有问题。</p>
		<p>设计模式的第一个原则是按接口而不是按实现编程，即要将变量设置为一个抽象类或接口数据类型的实例，而不是一个具体实现的实例。一个对象变量的数据类型不仅是这实例化的类，类的父类以及接口也可作为它的数据类型。因为PHP没有强制数据类型，它能过代码提示来实现这一点。</p>
		<p>上面这段说接口（interface）这个词，实际上理解为方法或界面更好一些。千万不要理解为TMD接口。这里指的以一个抽象类，用不同的方法实现多态，从而达到编程目的。<a href="NorthWestClient.php">示例在此</a>。</p>
		<p>第二个设计模式原则：应当优先选用组合对象而不是继承。将现有类组合在一起使用，要比用继承来实现好。这样一是可以避免子类继承大量用不到的方法，二是为了避免过度继承提高耦合度。<a href="DoMath.php">这是继承的示例</a>，下一个示例，将Domath类和InheriMath类分开定义，并不让后者继承前者，这样，在应用时，要分别实例化两个类，然而，这两个示例没有任何价值。虽然继承看起来更方便一些，但组合可以降低耦合度和维护难度。</p>
		<p>感觉使用接口的好处是将操作与内容分离，使类结构的定义更清晰，类的使用更加标准化。</p>
		<p>大多数设计模式同时包含有继承和组合，不过要避免使用继承形成一长串子类、孙子类等，设计模式建方使用浅继承，另外，不要用单一类完成所有功能，要使用组合类，一个类将任务传给其它类称为委托（delegation）。</p>
		<p>设计模式依目的不同可分为三类：创建型，结构型，行为型。创建型模式就是用来创建对象的模式，即创建类，它提供了一些方法来封装系统使用的具体类的有关知识，还可以隐藏实例创建和组和的相关信息。结构型模式关心的是组合结构，采用继承来组合接口或实例，它使用组合对象来创建新功能。到目前为止大多数模式都是行为型的，它的核心是算法和对象之间职责的分配。</p>
		<p>设计模式根据作用域不同可分为两类：类模式和对象模式。类模式的重点在于类及子类间的关系，使用继承实现。类模式是静态的，因此在编译时已经固定。对象模式强调的是可以在运行时改变的对象，因此这些模式更有动态性。</p>
		<p>注意，设计模式不是模板，它只是一些一般策略。不要建立硬编码的操作来满足请求，而是要以业务链的请求传递设计编码。</p>
	</article>
	<article>
		<header><h1>第4章 结合使用设计模式和UML</h1></header>
		<p>UML的类图显示了参与者（以类和接口表示）之间的关系和通信。UML类图中，接口和抽象类、抽象方法用斜体字。</p>
	</article>
</section>
<section class="part">
	<h1>第二部分 创建型设计模式</h1>
	<article>
		<header><h1>第5章 工厂方法设计模式</h1></header>
		<p>略</p>
	</article>
	<article>
		<header><h1>第6章 原型设计模式</h1></header>
		<p>略</p>
	</article>
</section>
<section class="part">
	<h1>第三部分 结构型设计模式</h1>
	<article>
		<header><h1>第7章 适配器模式</h1></header>
		<p>略</p>
	</article>
	<article>
		<header><h1>第8章 装饰器设计模式</h1></header>
		<p>略</p>
	</article>
</section>
<section class="part">
	<article>
		<header><h1>第9章 模版方法模式</h1></header>
		<p>略</p>
	</article>
	<article>
		<header><h1>第10章 状态设计模式</h1></header>
		<p>略</p>
	</article>
</section>
<section class="part">
	<h1>第五部分 MySQL和PHP设计模式</h1>
	<article>
		<header><h1>第11章 通用类负责连接，代理模式保证安全</h1></header>
		<p>略</p>
	</article>
	<article>
		<header><h1>第12章 策略设计模式的灵活性</h1></header>
		<p>略</p>
	</article>
	<article>
		<header><h1>第13章 职责链设计模式</h1></header>
		<p>略</p>
	</article>
	<article>
		<header><h1>第14章 利用观察者模式构建多设备CMS</h1></header>
		<p>略</p>
	</article>
</section>

<!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
<script src="http://cdn.bootcss.com/jquery/1.11.2/jquery.min.js"></script>
<!-- Include all compiled plugins (below), or include individual files as needed -->
<script src="../js/bootstrap.min.js"></script>
</body>
</html>